/***************************************************************************************************
 *
 * 版权信息：版权所有 (c) 2020, 保留所有权利
 *
 * 文件名称： VmModuleResultBase.h
 * 摘    要: VM模块结果基础类声明
 *
 * 当前版本：4.3.0
 * 日    期：2020-10-29 19:24:30
 * 备    注：新建
 ****************************************************************************************************/
#ifndef CVMMODULERESULTBASE_H__ // 2020-10-29 19:24:30
#define CVMMODULERESULTBASE_H__

#pragma warning(disable:4819)
#include <iostream>
#include <memory>
#include "iMVS-6000PlatformSDKDefine.h"

namespace VisionMasterSDK
{
    const static unsigned int MAX_MODULE_PARAMNAME_LENGTH = 128;     // 模块结果名称最大长度
    const static unsigned int MAX_MODULE_RESVALUE_LENGTH  = 4096;    // 模块结果值最大长度
    const static unsigned int MAX_POLYGON_VERTEX_NUM = 32;           // 多边形最大点数

    // 整型点信息结构
    typedef struct _PointI {
        int   X;
        int   Y;
    } PointI;

    // 浮点型点信息结构
    typedef struct _PointF {
        float   X;
        float   Y;
    } PointF;

    // 位姿结构
    typedef struct _Posture {
        PointF stPoint;
        float  R;
    } Posture;

    // 图像像素格式
    typedef enum _MvdPixelFormat_
    {
        MVD_PIXEL_NULL               = 0,
        //Mono8
        MVD_PIXEL_MONO_08           = IMVS_PF_IMG_FORMAT_MONO8,    //| 8b   |        D0           |         S0         |
        //RGB 3 RGBRGB...
        MVD_PIXEL_RGB_RGB24_C3      = IMVS_PF_IMG_FORMAT_RGB24,  //| 8b   |    RGB:D0           |  RGB:S0            |
    }MvdPixelFormat;

    // 图像基本信息结构
    typedef struct ImageBaseData__
    {
        void * ImageData;
        unsigned int DataLen;
        int Width;
        int Height;
        MvdPixelFormat Pixelformat;
    } ImageBaseData;

    // 矩形信息结构
    typedef struct RectI__
    {
        PointI RectPoint;
        int RectWidth;
        int RectHeight;
    } RectI;

    // 矩形信息结构
    typedef struct RectF__
    {
        PointF RectPoint;
        float RectWidth;
        float RectHeight;
    } RectF;

    // 矩形框信息结构
    typedef struct RectBox__
    {
        PointF CenterPoint;
        float BoxWidth;
        float BoxHeight;
        float Angle;
    } RectBox;

    // 直线信息结构
    typedef struct Line__
    {
        PointF StartPoint;
        PointF EndPoint;
        float Angle;
    } Line;

    // 不带角度的直线信息结构
    typedef struct Line_v2__
    {
        PointF StartPoint;
        PointF EndPoint;
    } Line_v2;

    // 圆信息结构
    typedef struct Circle__
    {
        PointF CenterPoint;
        float Radius;
    } Circle;

    // 圆环信息结构
    typedef struct Annulus__
    {
        PointF CenterPoint;
        float InnerRadius;
        float OuterRadius;
        float StartAngle;
        float AngleExtend;
    } Annulus;

    // 多边形信息结构
    typedef struct Polygon__
    {
        unsigned int VertexNum;
        PointF VertexPoints[MAX_POLYGON_VERTEX_NUM];
    } Polygon;

    // 缺陷修正信息结构
    typedef struct DefectFixture__
    {
        float MinWidth;
        float MaxWidth;
        float AverageWidth;
        float ApproximateArea;
    } DefectFixture;

    typedef struct MatchPoint__
    {
        float MatchOutlineX; // CH: 匹配轮廓点X | EN : Matching contour point X
        float MatchOutlineY; // CH: 匹配轮廓点Y | EN: Matching contour point Y
        float MatchOutlineScore; // CH: 匹配轮廓点分数 | EN: Matching contour point score
        int MatchOutlineIndex; // CH: 匹配轮廓点序号 | EN: Matching contour point No.
    } MatchPoint;

    // 类别信息数据
    typedef struct ClassInfo__
    {
        char Name[MAX_MODULE_PARAMNAME_LENGTH];
        int GrayValue;
    } ClassInfo;

    typedef struct  PixelImage__
    {
        ImageBaseData stIamge;
        int nClassNum;
        ClassInfo*  pInfo;
    } PixelImage;

    //修正数据
    typedef struct Fixture__
    {
        PointF stInitPoint;
        float  fInitAngle;
        float  fInitScaleX;
        float  fInitScaleY;
        PointF stRunPoint;
        float  fRunAngle;
        float  fRunScaleX;
        float  fRunScaleY;
    } Fixture;

    //轮廓点数据
    typedef struct MatchOutline__
    {
        int MatchPointNum; // 匹配点数量
        MatchPoint * MatchOutlinePoints; // 匹配点
    } MatchOutline;

    // 二进制数据
    typedef struct BaseDataInfo__
    {
        char            * pData;           // CH: 数据 | EN: Image data
        size_t            nLen;            // CH: 数据长度 | EN: Image data len
        unsigned int      nReserved[4];    // CH: 保留字段 | EN: Reserved
    } BaseDataInfo;

    // 字符串结果信息结构
    typedef struct StringValueInfo__
    {
        char            strValue[MAX_MODULE_RESVALUE_LENGTH];    // CH: 字符串数据 | EN: String data
        unsigned int    nReserved[4];                            // CH: 保留字段 | EN: Reserved
    } StringValueInfo;

    // 输出模块结果信息结构
    typedef struct OutputResultInfo__
    {
        char            strParamName[MAX_MODULE_PARAMNAME_LENGTH];    // CH: 结果名称 | EN: Result name
        int             nParamType;           // CH: 结果类型:1整型 2浮点型 3字符串型 | EN: Result type: 1-integer, 2-float, 3-string
        int             nValueNum;            // CH: 模块值个数 | EN: Number of module values
        int *           pIntValue;            // CH: 整型数据 | EN: Integer data
        float *         pFloatValue;          // CH: 浮点型数据 | EN: Float data
        StringValueInfo * pstStringValue;     // CH: 字符串型数据 | EN: String data
    } OutputResultInfo;

    // 脚本模块输出模块结果信息结构
    typedef struct ShellOutputResultInfo__
    {
        char            strParamName[MAX_MODULE_PARAMNAME_LENGTH];    // CH: 结果名称 | EN: Result name
        int             nParamType;           // CH: 结果类型:1整型 2浮点型 3字符串型 4图像型 6二进制数据型 | EN: Result type: 1-integer, 2-float, 3-string, 4-image, 6-byte
        int             nValueNum;            // CH: 模块值个数 | EN: Number of module values
        int *           pIntValue;            // CH: 整型数据 | EN: Integer data
        float *         pFloatValue;          // CH: 浮点型数据 | EN: Float data
        StringValueInfo * pstStringValue;     // CH: 字符串型数据 | EN: String data
        BaseDataInfo    * pstImgValue;        // CH: 图像型数据 | EN: Image data
        BaseDataInfo    * pstByteValue;       // CH: 二进制数据 | EN: Byte data
    } ShellOutputResultInfo;

    // 变量计算模块输出模块结果信息结构
    typedef struct CalOutputResultInfo__
    {
        char            strParamName[MAX_MODULE_PARAMNAME_LENGTH];    // CH: 结果名称 | EN: Result name
        int             nParamType;           // CH: 结果类型:1整型 2浮点型 3字符串型 | EN: Result type: 1-integer, 2-float, 3-string
        int             nValueNum;            // CH: 模块值个数 | EN: Number of module values
        int *           pIntValue;            // CH: 整型数据 | EN: Integer data
        float *         pFloatValue;          // CH: 浮点型数据 | EN: Float data
    } CalOutputResultInfo;

    // 整型数据
    typedef struct IntResultInfo__
    {
        int   nValueStatus;    // 单个输出参数的状态 1成功，其他值失败
        int   nValueNum;       // 模块值个数
        int * pIntValue;       // 整型数据
    }IntResultInfo;

    // 浮点型数据
    typedef struct FloatResultInfo__
    {
        int   nValueStatus;    // 单个输出参数的状态 1成功，其他值失败
        int   nValueNum;       // 模块值个数
        float * pFloatValue;   // 浮点型数据
    }FloatResultInfo;

    // 浮点型数据
    typedef struct StringResultInfo__
    {
        int   nValueStatus;    // 单个输出参数的状态 1成功，其他值失败
        int   nValueNum;       // 模块值个数
        StringValueInfo * pstStringValue; // 字符串型数据
    }StringResultInfo;

    // 图像像素数据
    typedef struct ImageResultInfo__
    {
        int   nValueStatus;    // 单个输出参数的状态 1成功，其他值失败
        int   nValueNum;       // 模块值个数
        BaseDataInfo * pstImageValue; // 图像像素数据
    } ImageResultInfo;

    // 点集型数据
    typedef struct PointsetResultInfo__
    {
        int   nValueStatus;    // 单个输出参数的状态 1成功，其他值失败
        int   nValueNum;       // 模块值个数
        BaseDataInfo * pstPointsetValue; // 点集型数据
    } PointsetResultInfo;

	// 椭圆信息结构
	typedef struct Ellipse__
	{
		PointF CenterPoint;	// 圆心点
		float MajorRadius;	// 长半轴
		float MinorRadius;	// 短半轴
		float Angle;	    // 角度
	} Ellipse;

    /** @class CModuleResultBase
     *  @brief 模块结果基类
     */
    class CModuleResultBase
    {
    public:

        /** @fn     explicit CModuleResultBase();
         *  @brief  构造函数,初始化成员变量
         *  @param  无
         *  @return 无
         */
        explicit CModuleResultBase();

        /** @fn     virtual ~CModuleResultBase();
         *  @brief  析构函数,销毁成员变量
         *  @param  无
         *  @return 无
         */
        virtual ~CModuleResultBase();

    public:
        /** @fn     GetThisClassName();
         *  @brief  用于在运行时获取对象的真实类名称（内部使用）
         *  @param  无
         *  @return 类名
         */
        virtual const char * GetThisClassName();

        /** @fn     GetErrorCode();
        *  @brief  错误码
        *  @param  无
        *  @return 类名
        */
        virtual unsigned int GetErrorCode();

    protected:
        unsigned int m_nErrorCode;
        IMVS_PF_MODULE_RESULT_INFO_LIST m_stModuResInfoList;
    };

    typedef std::shared_ptr<CModuleResultBase> CModuleResultBasePtr;
}

#endif // CVMOBJECTBASE_H__
